﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.IO;
using iBank.Datos;
using MySql.Data.MySqlClient;
using System.Data;

namespace iBank.Logica
{
    //NOTA: Se debe modificar la funcion que cambia la clave para que accese a la base de datos y la modifique


    class Servidor
    {
        //Metodo de respuesta de mensajes recibidos desde un cliente
        private string Responder(string mensaje)
        {
            MySqlConnection con = BaseDeDatos.Conexion();
            string query;


            string tarjeta = mensaje.Substring(1,10);
            string clave = mensaje.Substring(11,10);
            string cuenta = "";
            string monto = "";
            if (mensaje.Substring(0, 1) == "D" || mensaje.Substring(0, 1) == "R")
            {
                cuenta = mensaje.Substring(21, 10);
                monto = mensaje.Substring(31, mensaje.Length - 31);
            }
            else
                cuenta = mensaje.Substring(21, mensaje.Length - 21);
            string respuesta = "";
            
            //PARA INGRESAR AL SISTEMA SE ENVIA UNA "L" EN EL PRIMER CARACTER
            
            if(mensaje.Substring(0,1)== "L")
            {
                //VALIDAMOS QUE EXISTA LA TARJETA Y LA CLAVE

                query = "select * from tarjetas where numeroTarjeta = " + tarjeta + " and clave = " + clave;
                MySqlDataAdapter da = new MySqlDataAdapter(query, con);
                DataSet ds = new DataSet();
                da.Fill(ds, "tarjetas");

                if (ds.Tables["tarjetas"].Rows.Count == 0)
                {

                    //el requerimiento es invalido ya que la clave y la tarjeta es invalida
                    respuesta = "N";
                    //del caracter 1-20 indicamos que hay un error en el pedido
                    respuesta = respuesta + "tarjeta o clave invalida......";

                    return respuesta;
                }

                return "O";
            }

            //SI SE QUIERE CONSULTAR EL NUMERO DE CUENTAS DEL USUARIO
            if (mensaje.Substring(0,1) == "N")
            {
                query = "select * from cuentas where numeroTarjeta = " + tarjeta;
                MySqlDataAdapter da = new MySqlDataAdapter(query, con);
                DataSet ds = new DataSet();
                da.Fill(ds, "cuentas");

                //el requerimiento es valido
                respuesta = "O";
                //Del 1-20 indica que no hay errores
                respuesta = respuesta + "no hay error........";
                //del 21 en adelante indica el numero de cuentas
                respuesta = respuesta + ds.Tables["cuentas"].Rows.Count;

                return respuesta;
            }

            //SI ES CONSULTA(ENVIAR EN NUMERO DE CUENTA EL INDEX DE LA CUENTA DEVUELTO POR LA FUNCION DE CARACTER "N")
            if (mensaje.Substring(0,1) == "C")
            {
                query = "select * from cuentas where numeroTarjeta = " + tarjeta;
                MySqlDataAdapter da = new MySqlDataAdapter(query, con);
                DataSet ds = new DataSet();
                da.Fill(ds, "cuentas");

                //el requerimiento es valido
                respuesta = "O";
                //Del 1-20 indica que no hay errores
                respuesta = respuesta + "no hay error........";
                //del caracter 21-30 va la cuenta del 31 en adelante va el saldo
                respuesta = respuesta + ds.Tables["cuentas"].Rows[int.Parse(cuenta)][1].ToString() +
                            ds.Tables["cuentas"].Rows[int.Parse(cuenta)][2].ToString();

                return respuesta;
            }

            //SI SE DESEA MODIFICAR LA CLAVE DE LA TARJETA 
            if (mensaje.Substring(0,1) == "M")
            {
                //el requerimiento es valido
                respuesta = "O";
                //Del 1-20 indica que no hay errores
                respuesta = respuesta + "no hay error........";
                //se cambia la clave usando la que se mando en el mensaje en el campo de la clave y se guardan los datos              

                query = "update tarjetas set clave = '" + clave + "' where numeroTarjeta = " + tarjeta;
                MySqlDataAdapter da = new MySqlDataAdapter(query, con);
                DataSet ds = new DataSet();
                da.Fill(ds, "tarjetas");

                //del 21 en adelante se envia la clave para generar el reporte
                respuesta = respuesta + "Operacion exitosa";

                return respuesta;
            }

            //SI SE DESEA REALIZAR UN DEPOSITO 
            if (mensaje.Substring(0, 1) == "D")
            {
                respuesta = "O";
                respuesta = respuesta + "no hay error........";

                query = "select saldo from cuentas where numeroCuenta = " + cuenta;
                MySqlDataAdapter da = new MySqlDataAdapter(query, con);
                DataSet ds = new DataSet();
                da.Fill(ds, "cuentas");

                int suma = (int)ds.Tables["cuentas"].Rows[0][0];
                suma = suma + int.Parse(monto);
                //se realiza el deposito 
                query = "update cuentas set saldo = '" + suma + "' where numeroCuenta = " + cuenta;
                MySqlDataAdapter da1 = new MySqlDataAdapter(query, con);
                DataSet ds1 = new DataSet();
                da1.Fill(ds1, "cuentas");
          
                respuesta = respuesta + "Operacion exitosa";
                
                return respuesta;
            }

            //SI SE DESEA REALIZAR UN RETIRO
            if (mensaje.Substring(0, 1) == "R")
            {
                query = "select saldo from cuentas where numeroCuenta = " + cuenta;
                MySqlDataAdapter da = new MySqlDataAdapter(query, con);
                DataSet ds = new DataSet();
                da.Fill(ds, "cuentas");

                if ((int)ds.Tables["cuentas"].Rows[0][0] < int.Parse(monto))
                {
                    //el requerimiento es invalido ya que no dispone de saldo la cuenta
                    respuesta = "N";
                    //del caracter 1-20 indicamos que hay un error en el pedido
                    respuesta = respuesta + "saldo insuficiente....";

                    return respuesta;
                }
                else
                {
                    respuesta = "O";
                    respuesta = respuesta + "no hay error........";
                    //se realiza el retiro
                    int resta = (int)ds.Tables["cuentas"].Rows[0][0];
                    resta = resta - int.Parse(monto);
                    //se realiza el deposito 
                    query = "update cuentas set saldo = '" + resta + "' where numeroCuenta = " + cuenta;
                    MySqlDataAdapter da1 = new MySqlDataAdapter(query, con);
                    DataSet ds1 = new DataSet();
                    da1.Fill(ds1, "cuentas");
                    respuesta = respuesta + "Operacion exitosa";

                    return respuesta;
                }
            }


            return null;
        }

        public void Start()
        {
            // Creamos un TcpListener y le indicamos que
            //puerto va a poner en escucha.
            TcpListener tcpListener = new TcpListener(9898);

            while (1 == 1)
            {
                //Iniciamos la esucha
                tcpListener.Start();

                //Este método queda bloqueado hasta que
                //se conecte un cliente
                Socket socketForClient = tcpListener.AcceptSocket();
                if (socketForClient.Connected)
                {
                    // Si se conecta
                    Console.WriteLine("Cliente conectado.");
                    //Creamos el networkSream, el Reader y el writer
                    NetworkStream networkStream = new NetworkStream(socketForClient);

                    StreamWriter streamWriter = new StreamWriter(networkStream);

                    StreamReader streamReader = new StreamReader(networkStream);

                    //Esta es la data a enviar.
                    String mensaje = "Esta es la data de envio";

                    try
                    {

                        mensaje = streamReader.ReadLine(); //recibe el mjs del cliente
                        String respuesta = Responder(mensaje);

                        streamWriter.WriteLine(respuesta);
                        streamWriter.Flush();


                    }
                    finally
                    {
                        //Cerramos las conexiones
                        streamReader.Close();
                        streamWriter.Close();
                        networkStream.Close();
                        socketForClient.Close();
                    }
                }
            }
        }
    }
}
